package com.wsse.common.tool;

import java.io.*;
import java.util.ArrayList;

public class FileTool {
	/**
	 * 根据路径返回File
	 * @param path 路径,路径异常返回null
	 * @return 路径指定的文件
	 */
	public static File getFile(String path){
		if (EmptyTool.is(path))
			return null;
		return new File(path);
	}
	/**
	 * 根据路径返回File
	 * @param path 路径,路径异常返回null
	 * @param isCreate 当文件不存在时是否创建
	 * @return 路径指定的文件
	 */
	public static File getFile(String path,boolean isCreate){
		if (EmptyTool.is(path))
			return null;
		File file=new File(path);
		if(isCreate&&!file.exists()){
			try {
				if(path.contains("/")||path.contains(File.separator)){
					path=path.replace("/", File.separator);
					new File(path.substring(0,path.lastIndexOf(File.separator))).mkdirs();
				}
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return file;
	}
	/**
	 * 根据路径读取文本文件,按行读取文本内容,将每行文本存入ArrayList集合返回
	 *
	 * @param path
	 *            文件路径
	 * @return 字符串集合
	 */
	public ArrayList<String> readTxt2List(String path) {
		if (path == null)
			return null;
		ArrayList<String> list = new ArrayList<String>();
		try {
			String encoding = "utf-8";
			File file = new File(path);
			InputStreamReader isr = new InputStreamReader(new FileInputStream(
					file), encoding);
			BufferedReader br = new BufferedReader(isr);
			String line = null;
			while ((line = br.readLine()) != null) {
				list.add(line);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}
	/**
	 * 根据路径读取文本文件,读取文本所有内容,并返回字符串
	 *
	 * @param path
	 *            文件路径
	 * @return 字符串
	 */
	public static String readTxt(String path) {
		if (path == null)
			return null;
		StringBuffer sb=new StringBuffer();
		try {
			String encoding = "utf-8";
			File file = new File(path);
			InputStreamReader isr = new InputStreamReader(new FileInputStream(
					file), encoding);
			BufferedReader br = new BufferedReader(isr);
			String line = null;

			while ((line = br.readLine()) != null) {
				sb.append(line);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sb.toString();
	}
	/**
	 * 根据路径读取文本文件,读取文本所有内容,并返回字符串
	 *
	 * @param in 文件输入流
	 * @return 字符串
	 */
	public static String readTxt(InputStream in) {
		if (in == null)
			return null;
		StringBuffer sb=new StringBuffer();
		try {
			String encoding = "utf-8";
			InputStreamReader isr = new InputStreamReader(in, encoding);
			BufferedReader br = new BufferedReader(isr);
			String line;
			while ((line = br.readLine()) != null) {
				sb.append(line);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sb.toString();
	}
	/**
	 * 删除指定文件或文件夹
	 *
	 * @param file
	 *            需要删除的文件
	 * @return 删除成功返回true,失败返回false
	 */
	public boolean DeleteFile(File file) {
		if (file == null)
			return false;
		try {
			if (file.isFile()) {
				// 删除文件,并判断文件是否删除成功,如果失败,则退出递归
				if (!file.delete()) {
					System.out.println("删除失败:" + file.getAbsolutePath());
					return false;
				} else {
					return true;
				}
			} else {
				File[] files = file.listFiles();
				if (files == null) {
					for (File f : files) {
						// 删除文件,并判断文件是否删除成功,如果失败,则退出递归
						if (!DeleteFile(f))
							return false;
					}
				}
				// 删除文件夹,并返回删除状态
				return file.delete();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * 删除指定指定路径下的文件或文件夹
	 *
	 * @param path
	 *            路径,路径异常返回false
	 * @return 删除成功返回true,失败返回false
	 */
	public boolean DeleteFile(String path) {
		// 判断path是否为null或空字符串
		if (EmptyTool.is(path)) {
			System.out.println("删除失败:文件路径为空");
			return false;
		}
		File file = new File(path);
		// 判断path路径下文件或目录是否存在
		if (file.exists())
			return DeleteFile(file);
		else {
			System.out.println("删除失败:指定路径文件不存在,请检查路径,建议斜杠使用常量File.separator代替");
			return false;
		}
	}

	/**
	 * 获取文件或文件夹所有子元素的路径集合,并根据过滤器过滤
	 *
	 * @param file
	 *            为null时返回空集合
	 * @param filter
	 *            文件过滤器,为null时不过滤
	 * @return 文件绝对路径集合
	 */
	public ArrayList<String> getAllFilePath(File file, FileFilter filter) {
		ArrayList<String> list = new ArrayList<String>();
		try {
			if (file.isDirectory()) {
				File[] files = file.listFiles();
				if (files == null)
					return list;
				for (File f : files) {
					list.addAll(getAllFilePath(f, filter));
				}
			} else if (filter == null || filter.accept(file)) {
				list.add(file.getAbsolutePath());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * 获取指定路径文件或文件夹所有子元素的路径集合,并根据过滤器过滤
	 *
	 * @param path 路径,路径异常返回null
	 * @param filter
	 *            文件过滤器,为null时不过滤
	 * @return 文件绝对路径集合
	 */
	public ArrayList<String> getAllFilePath(String path, FileFilter filter) {
		if (EmptyTool.is(path)) {
			System.out.println("路径为空");
			return null;
		}
		File file = new File(path);
		// 判断文件是否存在
		if (file.exists()) {
			return getAllFilePath(file, filter);
		}
		return null;

	}

	/**
	 * 获取指定路径文件或文件夹所有子元素的集合,并根据过滤器过滤
	 *
	 * @param file
	 *            为null时返回空集合
	 * @param filter
	 *            文件过滤器,为null时不过滤
	 * @return 文件绝对路径集合
	 */
	public ArrayList<File> getAllFile(File file, FileFilter filter) {
		ArrayList<File> list = new ArrayList<File>();
		if (file == null)
			return list;
		try {
			// 判断是否是文件夹
			if (file.isDirectory()) {
				File[] files = file.listFiles();
				if (files == null)
					return list;
				for (File f : files) {
					list.addAll(getAllFile(f, filter));
				}
			} else if (filter == null || filter.accept(file)) {
				list.add(file);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;

	}

	/**
	 * 获取指定路径文件或文件夹所有子文件的集合,并根据过滤器过滤
	 *
	 * @param path 路径,路径异常返回null
	 * @param filter
	 *            文件过滤器,为null时不过滤
	 * @return 文件集合
	 */
	public ArrayList<File> getAllFile(String path, FileFilter filter) {
		if (EmptyTool.is(path))
			return null;
		File file = new File(path);
		if (file.exists())
			return getAllFile(file, filter);
		return null;
	}
}
